﻿Imports SistemaINCA.Models
Imports SistemaINCA.Models.ViewModels
Imports System.Net

Namespace Controllers

    Public Class AlumnosController
        Inherits BaseController

        Private m_DiasDiff_MonthLast As Integer() = {0, 1, 2, 3, 4, 5, 6}
        Private m_DiasDiff_MonthNext As Integer() = {6, 5, 4, 3, 2, 1, 0}
        Private m_Meses As String() = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", _
                                       "Octubre", "Noviembre", "Diciembre"}

        <Authorize(Roles:="ALU")> _
        Function Index() As ActionResult
            'Lo primero que vamos hacer es obtener la info del del modelo para pasarselo a la Vista
            'Dim dbRepositorio As New SchoolClickDB_Repositorio
            'Dim modelAlumnoGrado As GET_INFO_ALUMNO_LAST_GRADO_DATATYPE
            'Try
            '    modelAlumnoGrado = dbRepositorio.GET_INFO_ALUMNO_GRADO_ACTUAL(User.Identity.Name)
            'Catch ex As ApplicationException
            '    'Si ocurre este tipo de excepcion, significa que no se encontro la info. delo grado al que pertenece el usuario
            '    'por lo tanto devolveremos a la vista solo el nombre
            '    modelAlumnoGrado = New GET_INFO_ALUMNO_LAST_GRADO_DATATYPE
            '    modelAlumnoGrado.ESTUDIANTE = "Juan Miguel Pérez Pineda"
            '    modelAlumnoGrado.GRADO = "Tercer Año de Bachillerato Tecnico Vocacional Especialidad Electronica Seccion G"
            'Catch ex As Exception
            '    Throw New Exception("Ocurrio un error al determinar la informacion y el grado al que pertenece el alumno.", ex)
            'End Try
            'Return View(modelAlumnoGrado)
        End Function

        <Authorize(Roles:="ERA")> _
        <HttpPost()> _
        Function PartialView_PerfilAlumno(NIE As String) As ActionResult
            Dim db As New SchoolClickDB_Repositorio
            Dim enc_NIE = HttpUtility.HtmlEncode(NIE)
            Dim model As New PerfilAlumnoModel
            Try
                model.NIE = NIE
                model.Viewer = If(User.IsInRole("ERA"), "R", "A")
                model.DatosPersonales = db.IAlumnos.GetAlumno(NIE)
                model.Responsables = db.IResponsables.GetResponsablesDeAlumno(NIE)
                Return PartialView("_ViewPerfilAlumno", model)
            Catch ex As Exception
                Response.StatusCode = HttpStatusCode.InternalServerError
                Return PartialView("_ViewPerfilAlumno", Nothing)
            End Try
        End Function

        <Authorize(Roles:="ERA")> _
        <HttpPost()> _
        Function PartialView_AllNotasAlumno(NIE As String) As ActionResult
            Dim db As New SchoolClickDB_Repositorio
            Dim enc_NIE = HttpUtility.HtmlEncode(NIE)
            Dim model As New GradosAlumnosModel
            Try
                model.NIE = NIE
                model.listGrados = db.IAlumnos_Grados.GetGrados_ByAlumno(enc_NIE)
                Return PartialView("_ViewNotasAlumnoP", model)
            Catch ex As Exception
                Response.StatusCode = HttpStatusCode.InternalServerError
                Return PartialView("_ViewNotasAlumnoP", Nothing)
            End Try
        End Function

        <Authorize(Roles:="ERA")> _
        <HttpPost()> _
        Function PartialView_NotasPeriodosGrado(NIE As String, IDGrado As String) As ActionResult
            Dim db As New SchoolClickDB_Repositorio
            Dim enc_NIE = HttpUtility.HtmlEncode(NIE)
            Dim enc_ID = HttpUtility.HtmlEncode(IDGrado)
            Dim cSplit() As Char = {"-"}
            Dim strData = IDGrado.Split(cSplit)
            Dim model As New NotasPeriodosGradoModel
            Try
                model.NIE = NIE
                model.listPeriodos = db.IPeriodos.GetPeriodos_ByAño(strData(2))
                model.NotasPeriodos = db.IAlumnos.GetNotas_ByAñoEscolar_PIVOT(NIE, strData(2))
                Return PartialView("_ViewTableNotasPeriodos", model)
            Catch ex As Exception
                Response.StatusCode = HttpStatusCode.InternalServerError
                Return PartialView("_ViewTableNotasPeriodos", Nothing)
            End Try
        End Function

        <Authorize(Roles:="ALU")> _
        Function View_DatosPersonales() As ActionResult
            'Dim dbRepositorio As New SchoolClickDB_Repositorio
            'Dim modelInfoA As GET_INFO_PERSONAL_BYALUMNO_DATATYPE

            'Try
            '    modelInfoA = dbRepositorio.GET_INFO_PERSONAL_ALUMNO(User.Identity.Name)
            '    Return (PartialView(New ViewModels.PerfilAlumnoModel() With
            '                        {.CarnetAlumno = modelInfoA.ID_USUARIO,
            '                         .Nombres = modelInfoA.NOMBRES,
            '                         .Apellidos = modelInfoA.APELLIDOS,
            '                         .Direccion = modelInfoA.DIRECCION_DE_CASA,
            '                         .Telefono = String.Format("{0:0000-0000}", Integer.Parse(modelInfoA.TELEFONO))
            '                         }))
            'Catch ex As Exception
            '    Throw New Exception(ex.Message, ex)
            'End Try
        End Function

        <Authorize(Roles:="ALU")> _
        Function View_NotasLast_Periodo() As ActionResult
            'Dim dbRepositorio As New SchoolClickDB_Repositorio

            'Try
            '    'Recuperamos el Periodo y el Año del ultimo periodo del alumno
            '    Dim tituloPeriodo As GET_LAST_PERIODO_TITULO_DATATYPE
            '    Using cnn As New SchoolClickEntities
            '        tituloPeriodo = cnn.GET_LAST_PERIODO_TITULO(User.Identity.Name).SingleOrDefault
            '    End Using
            '    ViewBag.Titulo_Periodo = String.Format("Periodo de Evaluacion No. {0} - Año: {1}", tituloPeriodo.PERIODO.Substring(1), tituloPeriodo.LAST_YEAR)
            '    Return PartialView(dbRepositorio.GET_NOTAS_RESUMEN_LAST_PERIODO_LAST_YEAR(User.Identity.Name))
            'Catch ex As Exception
            '    Throw New Exception(ex.Message, ex)
            'End Try
        End Function

        <Authorize(Roles:="ALU")> _
        Function Notas() As ActionResult
            'Dim db As New SchoolClickDB_Repositorio

            'Try
            '    Dim items As IEnumerable(Of SelectListItem) = db.Get_AllPeriodos_Por_Alumno(User.Identity.Name).Select( _
            '                                                    Function(p) New SelectListItem With { _
            '                                                                             .Text = p.PERIODO_NAME,
            '                                                                             .Value = p.ID_PERIODO})
            '    ViewBag.Periodos = items
            '    Return View()
            'Catch ex As Exception
            '    Throw New Exception(ex.Message, ex)
            'End Try
        End Function

        <Authorize(Roles:="ALU")> _
        <HttpGet()> _
        Function _View_Notas(IDPeriodo As Integer) As ActionResult
            Dim db As New SchoolClickDB_Repositorio

            'Try
            '    'Primero determinamos el año y periodo del IDPeriodo enviado por el usuario
            '    Dim InfoPeriodo As GET_ANIO_AND_PERIODO_BY_IDPERIODO_DE_ALUMNO_DATATYPE = db.Get_Año_y_Periodo_by_IDPeriodo(User.Identity.Name, IDPeriodo)
            '    Dim Año As String = InfoPeriodo.ANO_LECTIVO.ToString
            '    Dim Periodo As String = InfoPeriodo.PERIODO

            '    'Guardamos las variables globales
            '    ViewBag.Año = String.Format("data-anio={0}", Año)
            '    ViewBag.Periodo = String.Format("data-periodo={0}", Periodo)

            '    'Ahora que ya sabemos el año y el periodo al que pertenece, podemos invocar el procedimiento para recuperar las notas
            '    'del alumno indicado
            '    ViewBag.Titulo_Periodo = String.Format("Periodo de Evaluacion No. {0} - Año: {1}", Periodo, Año)
            '    Return PartialView("View_NotasLast_Periodo", db.GET_NOTAS_BY_AÑO_AND_PERIODO(User.Identity.Name, Periodo, Año))
            'Catch ex As Exception
            '    Throw New Exception(ex.Message, ex)
            'End Try
        End Function

        <Authorize(Roles:="ALU")> _
        <HttpGet()> _
        Function _View_Detalle_Notas(Materia As Integer, Anio As String, Periodo As String) As ActionResult
            'Dim db As New SchoolClickDB_Repositorio
            'Try
            '    ViewBag.NameMateria = db.Get_Name_Materia(Materia)
            '    Return PartialView("_View_Detalle_Notas", db.Get_Detalle_Notas_ByMateria(User.Identity.Name, Periodo, Anio, Materia))
            'Catch ex As Exception
            '    Throw New Exception(ex.Message, ex)
            'End Try
        End Function

        <Authorize(Roles:="ALU")> _
        Function Asistencia() As ActionResult
            ViewBag.Anio_Actual = Date.Now.Year
            ViewBag.Mes_Actual = Date.Now.Month
            'Dim db As New SchoolClickDB_Repositorio
            'Try
            '    Dim y As GET_MAX_AND_MIN_YEAR_BY_ALUMNO_DATATYPE = db.Get_Max_and_Min_AñosGrados(User.Identity.Name)
            '    ViewBag.MaxYear = y.MAX_YEAR
            '    ViewBag.MinYear = y.MIN_YEAR
            'Catch ex As Exception
            '    ex.Data.Clear()
            'End Try
            Return View()
        End Function

        <Authorize(Roles:="ALU")> _
        <HttpGet()> _
        Function _Load_Asis_Alumno(Mes As Integer, Anio As Integer) As ActionResult
            'Dim db As New SchoolClickDB_Repositorio
            'ViewBag.MesSTR = String.Format(m_Meses(Mes - 1))
            'Try
            '    Dim _MesActual As Integer = Mes
            '    Dim _AñoActual As Integer = Anio

            '    'Recuperamos de la base de datos el listado de asistencia del alumno
            '    Dim ListAsis As List(Of ASIS_ALUM_BY_MES_AND_ANIO_DATATYPE) = db.Get_Asistencia_Alumno_ByMes(User.Identity.Name, _MesActual, _AñoActual)

            '    Dim diaAsis As ASIS_ALUM_BY_MES_AND_ANIO_DATATYPE

            '    Dim i As Integer
            '    'Lo primero que vamos hacer, es recuperar el mes en el que nos encontramos, los dias del mes y el dia de la semana del primer mes
            '    Dim _DiasMesActual As Integer = Date.DaysInMonth(_AñoActual, _MesActual)
            '    Dim _DiaSemana As DayOfWeek = New Date(_AñoActual, _MesActual, 1).DayOfWeek

            '    'Ahora debemos determinar cuantos dias hay que agregar del mes pasado
            '    Dim _MesAnterior As Integer
            '    Dim _AñoAnterior As Integer
            '    If _MesActual = 1 Then
            '        'Si el mes actual es Enero, debemos regresar a Diciembre del Año anterior
            '        _MesAnterior = 12
            '        _AñoAnterior = _AñoActual - 1
            '    Else
            '        'De lo contrario si es cualquier otro mes, solo restamos un mes y mantemos el año
            '        _MesAnterior = _MesActual - 1
            '        _AñoAnterior = _AñoActual
            '    End If

            '    'Debemos encontrar la dif de dias de la semana q hay entre el inicio del mes y el mes anterior
            '    Dim _DiasDiff_Mes As Integer = m_DiasDiff_MonthLast(_DiaSemana)
            '    Dim _TDiasMesAnterior As Integer = Date.DaysInMonth(_AñoAnterior, _MesAnterior)

            '    'Rellenamos nuestro Array con todos los dias del mes anterior
            '    Dim _ListDaysMonth As New List(Of CalendarDayModel)
            '    For i = _TDiasMesAnterior - _DiasDiff_Mes + 1 To _TDiasMesAnterior
            '        _ListDaysMonth.Add(New CalendarDayModel With {.Dia = i, .IsMesActivo = False})
            '    Next

            '    'Ahora, rellenamos el array con todos los dias del mes actual
            '    For i = 1 To _DiasMesActual
            '        'Ahora tendremos que ir comparando dia a dia con el listado de asistencia
            '        diaAsis = (From day In ListAsis
            '                  Where day.DIA = i
            '                  Select day).SingleOrDefault

            '        'Comprobamos si se encontro una coincidencia o no con el dia del calendario
            '        If Not IsNothing(diaAsis) Then
            '            'Si se encontro una coincidencia con el calendario entonces se pasan los datos al modelo
            '            _ListDaysMonth.Add(New CalendarDayModel With {.Dia = i,
            '                                                          .DescAsueto = diaAsis.DESCRIPCION,
            '                                                          .EstadoICO = diaAsis.ICO,
            '                                                          .HoraEntrada = If(diaAsis.HORA_ENTRADA Is Nothing, "              --:--", diaAsis.HORA_ENTRADA.Value.ToString("hh:mm tt")),
            '                                                          .HoraSalida = If(diaAsis.HORA_SALIDA Is Nothing, "             --:--", diaAsis.HORA_SALIDA.Value.ToString("hh:mm tt")),
            '                                                          .IsEntro = diaAsis.ENTRO,
            '                                                          .IsMesActivo = True,
            '                                                          .IsSalio = diaAsis.SALIO,
            '                                                          .TipoDia = diaAsis.TIPO})
            '        Else
            '            _ListDaysMonth.Add(New CalendarDayModel With {.Dia = i,
            '                                                          .IsMesActivo = True,
            '                                                          .TipoDia = "I"})
            '        End If

            '    Next

            '    'Ya por ultimo debemos averiguar cuantos dias debemos agregar del mes siguiente a nuestro calendario
            '    Dim _MesSiguiente As Integer
            '    Dim _AñoSiguiente As Integer
            '    If _MesActual = 12 Then
            '        _MesSiguiente = 1
            '        _AñoSiguiente = _AñoActual + 1
            '    Else
            '        _MesSiguiente = _MesActual + 1
            '        _AñoSiguiente = _AñoActual
            '    End If
            '    _DiasDiff_Mes = m_DiasDiff_MonthNext(New Date(_AñoActual, _MesActual, _DiasMesActual).DayOfWeek)

            '    'Llenamos el listado con los dias del mes siguiente
            '    For i = 1 To _DiasDiff_Mes
            '        _ListDaysMonth.Add(New CalendarDayModel With {.Dia = i, .IsMesActivo = False})
            '    Next

            '    ViewBag.DaysCalendar = _ListDaysMonth

            '    Return PartialView()
            'Catch ex As Exception
            '    Throw New Exception(ex.Message, ex)
            'End Try
        End Function
    End Class
End Namespace
